﻿Ext.util.Format = {
    defaultDateFormat: 'm/d/Y',
    escapeRe: /('|\\)/g,
    trimRe: /^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,
    formatRe: /\{(\d+)\}/g,
    escapeRegexRe: /([-.*+?^${}()|[\]\/\\])/g,

    // 限定字符串value的最大长度为len，如果value的长度超出，将以限定长度截取并将后三个字符替换为'...'
    ellipsis: function (value, len, word) {
        // value长度大于限定长度
        if (value && value.length > len) {
            if (word) {

                // 截取限定长度-2的字符串
                var vs = value.substr(0, len - 2),
                // ' '或'.'或'!'或'?'在字符串中出现的最后位置
                index = Math.max(vs.lastIndexOf(' '), vs.lastIndexOf('.'), vs.lastIndexOf('!'), vs.lastIndexOf('?'));
                // 如果上述最后位置存在
                if (index != -1 && index >= (len - 15)) {
                    return vs.substr(0, index) + "..."; // 按 ' '或'.'或'!'或'?'截取并将...加入字符串末尾
                }
            }

            // 将value以限定长度截取并将后三个字符替换为...
            return value.substr(0, len - 3) + "...";
        }
        return value;
    },

    // 将参数s中的 - . * + ? ^ $ { } ( ) | [ ] / \ 字符转换成转义字符
    escapeRegex: function (s) {
        return s.replace(Ext.util.Format.escapeRegexRe, "\\$1");
    },

    // 将参数string中的 ' \ 字符转换成转义字符
    escape: function (string) {
        return string.replace(Ext.util.Format.escapeRe, "\\$1");
    },

    //切换两个交替值之间的字符串。
    //参数string是当前字符串，如果string的值与value相同，则返回other，否则返回value，string值是不会被改变的。
    toggle: function (string, value, other) {
        return string == value ? other : value;
    },

    // 清除字符串string的首尾空白字符
    trim: function (string) {
        return string.replace(Ext.util.Format.trimRe, "");
    },

    // 限定字符串val的最小长度为size，如果val的长度小于size，则少的部分在前面用若干个ch或' '补齐
    leftPad: function (val, size, ch) {
        var result = String(val);
        ch = ch || " ";
        while (result.length < size) {
            result = ch + result;
        }
        return result;
    },

    // 完整参数format(format, arg0, arg1, ……, argn)。格式化字符串format，将字符串format中的{0}、{1}、……、{n}替换成arg0, arg1, ……, argn
    format: function (format) {
        var args = Ext.toArray(arguments, 1); // format之后的参数
        return format.replace(Ext.util.Format.formatRe, function (m, i) {
            return args[i];
        });
    },

    // 将参数value中的 & > < " 转换成html实体字符 "&amp;" "&gt;" "&lt;" "&quot;"
    htmlEncode: function (value) {
        return !value ? value : String(value).replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
    },

    // 将参数value中的 html实体字符 "&amp;" "&gt;" "&lt;" "&quot;"转换成 & > < "
    htmlDecode: function (value) {
        return !value ? value : String(value).replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
    },


    date: function (v, format) {
        if (!v) {
            return "";
        }
        if (!Ext.isDate(v)) {
            v = new Date(Date.parse(v));
        }
        return v.dateFormat(format || Ext.util.Format.defaultDateFormat);
    }
};